package cn.mujiankeji.mbrowser.界面.小窗页

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField // 使用 OutlinedTextField 获得更清晰的边界
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.界面.框架.小窗视图.小窗状态
import cn.mujiankeji.mbrowser.界面.组件.布局.输入窗口布局
import kotlinx.coroutines.delay

/**
 * 数字输入窗口的状态类
 * @param 允许小数 是否允许输入小数点
 * @param 允许负数 是否允许输入负号
 * @param 响应 (结果: String?) -> Unit 返回输入的数字字符串，如果用户取消则返回 null
 */
class 数字输入窗口状态(
    val 默认值: String = "",
    val 提示值: String = "请输入数字",
    val 允许小数: Boolean = true,
    val 允许负数: Boolean = true,
    val 响应: (String?) -> Unit
) : 小窗状态() {

    var 输入值 by mutableStateOf(TextFieldValue(默认值, TextRange(默认值.length)))
    var 错误信息 by mutableStateOf<String?>(null)
    val focusRequester = FocusRequester()

    fun 提交() {
        val text = 输入值.text
        // 可以在这里添加更严格的最终校验，如果需要的话
        if (isValid(text)) {
            响应(text.ifEmpty { null }) // 如果为空也视为取消或无效输入，取决于需求
            销毁小窗()
        } else {
            错误信息 = "无效的数字格式"
        }
    }

    fun 取消() {
        响应(null)
        销毁小窗()
    }

    // 实时校验输入
    fun onValueChange(newValue: TextFieldValue) {
        val filteredText = filterInput(newValue.text)
        if (isValid(filteredText)) {
            错误信息 = null
        } else {
            错误信息 = "无效的数字格式" // 可选：实时显示错误
        }

        // 调整光标位置
        val originalSelection = newValue.selection
        val newSelectionStart = originalSelection.start.coerceAtMost(filteredText.length)
        val newSelectionEnd = originalSelection.end.coerceAtMost(filteredText.length)

        输入值 = newValue.copy(
            text = filteredText,
            selection = TextRange(newSelectionStart, newSelectionEnd)
        )
    }

    private fun filterInput(input: String): String {
        var temp = input
        if (!允许负数) {
            temp = temp.filter { it != '-' }
        }
        if (!允许小数) {
            temp = temp.filter { it != '.' }
        }
        return temp.filter { it.isDigit() || (允许小数 && it == '.') || (允许负数 && it == '-') }
    }

    // 简单校验规则，可根据需要扩展
    private fun isValid(input: String): Boolean {
        if (input.isEmpty()) return true // 允许空输入
        if (input == "-" && 允许负数) return true // 允许只输入负号
        if (input.endsWith('.') && 允许小数) return true // 允许以小数点结尾（输入过程中）

        val regex = when {
            允许小数 && 允许负数 -> Regex("^[-]?\\d*(\\.\\d*)?$")
            允许小数 && !允许负数 -> Regex("^\\d*(\\.\\d*)?$")
            !允许小数 && 允许负数 -> Regex("^[-]?\\d+$")
            else -> Regex("^\\d+$") // !允许小数 && !允许负数
        }
        return regex.matches(input)
    }
}

@Composable
fun 数字输入窗口实现(state: 数字输入窗口状态) {

    LaunchedEffect(Unit) {
        delay(100) // 稍作延迟确保窗口渲染完成
        state.focusRequester.requestFocus()
    }

    输入窗口布局(
        销毁 = { state.取消() },
        提交 = { state.提交() }
    ) {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .padding(16.dp)
        ) {
            OutlinedTextField(
                value = state.输入值,
                onValueChange = { state.onValueChange(it) },
                modifier = Modifier
                    .fillMaxWidth()
                    .focusRequester(state.focusRequester),
                label = { Text(state.提示值) },
                keyboardOptions = KeyboardOptions(
                    keyboardType = if (state.允许小数) KeyboardType.Decimal else KeyboardType.Number,
                    imeAction = ImeAction.Done
                ),
                keyboardActions = KeyboardActions(onDone = { state.提交() }),
                singleLine = true,
                isError = state.错误信息 != null,
                supportingText = { 
                    if (state.错误信息 != null) {
                        Text(state.错误信息!!, color = MaterialTheme.colorScheme.error)
                    }
                }
            )
        }
    }
} 